package logger

import (
	"os"
	"path/filepath"
	"time"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

var Logger *zap.SugaredLogger

// InitLogger 初始化日志系统
func InitLogger(env string) {
	// 创建日志目录
	logDir := "logs"
	if err := os.MkdirAll(logDir, os.ModePerm); err != nil {
		panic("创建日志目录失败: " + err.Error())
	}

	// 配置日志级别
	var level zapcore.Level
	switch env {
	case "production":
		level = zap.InfoLevel
	default:
		level = zap.DebugLevel
	}

	// 创建核心配置
	cores := []zapcore.Core{
		createFileCore(logDir, level),
		createConsoleCore(level),
	}

	// 创建日志记录器
	core := zapcore.NewTee(cores...)
	logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
	Logger = logger.Sugar()
}

// 创建文件日志核心
func createFileCore(logDir string, level zapcore.Level) zapcore.Core {
	// 配置日志轮转
	lumberJackLogger := &lumberjack.Logger{
		Filename:   filepath.Join(logDir, "app.log"),
		MaxSize:    100,   // 单个文件最大100MB
		MaxBackups: 30,    // 保留30个历史文件
		MaxAge:     1,     // 保留90天
		Compress:   false, // 不压缩历史文件
	}

	// 文件编码器配置
	fileEncoderConfig := zap.NewProductionEncoderConfig()
	fileEncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	fileEncoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder

	return zapcore.NewCore(
		zapcore.NewJSONEncoder(fileEncoderConfig),
		zapcore.AddSync(lumberJackLogger),
		zap.NewAtomicLevelAt(level),
	)
}

// 创建控制台日志核心
func createConsoleCore(level zapcore.Level) zapcore.Core {
	consoleEncoderConfig := zap.NewDevelopmentEncoderConfig()
	consoleEncoderConfig.EncodeTime = customTimeEncoder
	consoleEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder

	return zapcore.NewCore(
		zapcore.NewConsoleEncoder(consoleEncoderConfig),
		zapcore.AddSync(os.Stdout),
		zap.NewAtomicLevelAt(level),
	)
}

// 自定义时间格式
func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}

// Sync 确保所有缓冲日志都写入
func Sync() {
	_ = Logger.Sync()
}
